package com.zly.functions;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.zly.DJUtils;

import java.util.Objects;

public class JsonOperateFP extends FunctionProviderBase{

    //检查Json文件中JsonPointer所指定节点是否存在指定的键
    @Register
    public static boolean json_contain_key(String jsonPath, String jsonPointerExpr, String keyName){
        JsonNode node = readJsonNode(jsonPath).at(jsonPointerExpr);
        return node.has(keyName);
    }

    //检查Json文件中JsonPointer所指定节点是否存在指定的值
    @Register
    public static boolean json_check_value(String jsonPath, String jsonPointerExpr, Object value){
        JsonNode node = readJsonNode(jsonPath).at(jsonPointerExpr);
        //value作为函数参数从DynamicJson中被读取时，就已通过DJUtil.convert转为Object的引用
        return Objects.equals(value, DJUtils.convert(node));
    }

    //返回Json文件中JsonPointer所指定节点的Json数组，是否存在指定的值
    @Register
    public static boolean json_array_contain_elem(String jsonPath, String jsonPointerExpr, Object elem){
        ArrayNode node = (ArrayNode)readJsonNode(jsonPath).at(jsonPointerExpr);
        for(int i = 0; i < node.size(); i++){
            if(Objects.equals(elem, DJUtils.convert(node.get(i)))){
                return true;
            }
        }
        return false;
    }

    //返回Json文件中JsonPointer所指定节点的Json数组，其指定值的最靠前的下标。不存在该值则返回-1
    @Register
    public static int json_array_index_of_elem(String jsonPath, String jsonPointerExpr, Object elem){
        ArrayNode node = (ArrayNode)readJsonNode(jsonPath).at(jsonPointerExpr);
        for(int i = 0; i < node.size(); i++){
            if(Objects.equals(elem, DJUtils.convert(node.get(i)))){
                return i;
            }
        }
        return -1;
    }

    //返回Json文件中JsonPointer所指定节点的Json数组长度
    @Register
    public static int json_array_length(String jsonPath, String jsonPointerExpr){
        ArrayNode node = (ArrayNode)readJsonNode(jsonPath).at(jsonPointerExpr);
        return node.size();
    }

    //检查Json文件中JsonPointer所指定节点，其字符串是否满足正则表达式regex
    @Register
    public static boolean json_match_pattern(String jsonPath, String jsonPointerExpr, String regex){
        JsonNode node = readJsonNode(jsonPath).at(jsonPointerExpr);
        return node.toString().matches(regex);
    }

    //获取Json文件中JsonPointer所指定节点的值
    @Register
    public static Object json_get_value(String jsonPath, String jsonPointerExpr){
        JsonNode node = readJsonNode(jsonPath).at(jsonPointerExpr);
        return DJUtils.convert(node);
    }

    //构造
    private JsonOperateFP(){}

}
